//
//  main.c
//  数据结构与算法分析-c语言描述
//
//  Created by 黄辉 on 16/11/30.
//  Copyright © 2016年 黄辉. All rights reserved.
//

#include <stdio.h>
#include <time.h>
//第一章       //每个不同程序用空格隔开,一次最好运用一个程序

#define k 3
int main(int argc, const char * argv[]) {
   // int s[]= {2,3,5,4,6,8,9,10,11};
    time_t startTime,stopTime;
    time(&startTime);

//    for (int i = 0; i < sizeof(s)/4; ++i) {     //冒泡升序
//                for (int j = 0; j < sizeof(s)/4; j++) {
//                    int x;
//                    if (s[j]>s[i]) {
//                        x = s[j];
//                        s[j] = s [i];
//                        s[i] = x;
//                    }
//                }
//            }
     //    printf("第k大的数为%d",s[k]);

    
//
//    for (int i = 0; i < sizeof(s)/4; ++i) {     //冒泡讲序
//        for (int j = 0; j < sizeof(s)/4; j++) {
//            int x;
//            if (s[j]<s[i]) {
//                x = s[j];
//                s[j] = s [i];
//                s[i] = x;
//            }
//        }
//    }


//    double i = 12000,x = 0;
//    for (int y = 1; y <= 15; y++,i = i + 12000) {   //按保险模式买农行第一类
//        
//    
//    for (int j = 1; j <= 4; j ++) {
//        x = i * 0.01;
//        i = i + x;
//        printf("第%d年%d个三月结束利息为%lf元,本金加利息总额为%lf元\n",y,j,x,i);
//        
//    }
//        
//        printf("第%d年此模式本金十八万结余总金为%lf元\n",y,i);
//    }     //
//    for (int y = 1; y <= 15; y++) {
//        
//        double h = 0;
//        for (int j = 1; j <= 4; j ++) {
//            x = i * 0.01;
//            h = x + h;
//            printf("停加利息,仅以基金存入第%d个三月利息为%lf元\n",j,x);
//        }
//        printf("此模式第一年利息总金为%lf元,此为自己活用钱\n",h);
//    }     //
    


//        double i = 12000,x = 0;                         //按保险模式买农行第二类
//        for (int y = 1; y <= 15; y++,i = i + 12000) {
//    
//    
//        for (int j = 1; j <= 6; j ++) {
//            x = i * 0.006624658;
//            i = i + x;
//            printf("第%d年%d次投结束利息为%lf元,本金加利息总额为%lf元\n",y,j,x,i);
//    
//        }
//    
//            printf("第%d年此模式本金共18万结余总金为%lf元\n",y,i);
//        }     //
//        for (int y = 1; y <= 15; y++) {
//    
//            double h = 0;
//            for (int j = 1; j <= 6; j ++) {
//                x = i * 0.006624658;
//                h = x + h;
//                printf("停加利息,仅以基金存入第%d个三月利息为%lf元\n",j,x);
//            }
//            printf("此模式第一年利息总金为%lf元,此为自己活用钱\n",h);
//        }     //


    
//    double i = 12000,x = 0;                        //按保险模式买农行第三类
//    for (int y = 1; y <= 15; y++,i = i + 12000) {
//        
//        
//        for (int j = 1; j <= 5; j ++) {
//            x = i * 0.009246575;
//            i = i + x;
//            printf("第%d年%d次投结束利息为%lf元,本金加利息总额为%lf元\n",y,j,x,i);
//            
//        }
//        
//        printf("第%d年此模式本金共18万结余总金为%lf元\n",y,i);
//    }     //
//    for (int y = 1; y <= 15; y++) {
//        
//        double h = 0;
//        for (int j = 1; j <= 5; j ++) {
//            x = i * 0.009246575;
//            h = x + h;
//            printf("停加利息,仅以基金存入第%d个三月利息为%lf元\n",j,x);
//        }
//        printf("此模式第一年利息总金为%lf元,此为自己活用钱\n",h);
//    }     //
    

//    double i = 300000,x = 0;
//    for (int y = 1; y <= 15; y++,i = i + 12000) {
//        
//        
//        for (int j = 1; j <= 5; j ++) {
//            x = i * 0.009246575;
//            i = i + x;
//            printf("第%d年%d次投结束利息为%lf元,本金加利息总额为%lf元\n",y,j,x,i);
//            
//        }
//        
//        printf("第%d年此模式本金30万结余总金为%lf元\n",y,i);
//    }     //
    

    
//    for (int i = 0; i < k; ++i) {           //第三种冒泡排序
//        for (int j = 0; j < k; j++) {
//            int x=0;
//            if (s[j] < s[i]) {
//                x = s[i];
//                s[i] = s[j];
//                s[j] = x;
//            }
//        }
//        
//    }
//    for (int i = 0; i < k; i++) {
//        printf("%d\n",s[i]);
//    }
//   // printf("%d\n",s[k-1]);
//    for (int i = k; i < sizeof(s)/4; i++) {
//        
//        if (s[k-1] > s[i])
//            continue;
//        else {
//            for (int j = 0; j < k ; j++) {
//                int x = 0;
//                if (s[j]<s[i]) {
//                    x = s[j];
//                    s[j] = s[i];
//                    s[i] = x;
//                }
//            }
//        
//        }
//    }
//    printf("该数组第%d大的数为%d",k,s[k-1]);
 

//    int arr(int a[],int n);      //证明斐波那契数
//    double feibo(double n);
//    int i,a[100] = {1,1};
//    double x;
//    printf("请输入一个大于一的整数:");
//    scanf("%d",&i);
//    x = i;
//    if ( feibo(i) > arr(a, i))
//        printf("定理正确");
//    else
//        printf("定理不正确");
    
    //关于递归
    //两个基本准则
    //1:基准情形.你必须要有某些基准的情形,它们不用递归也能求解
    //2:不断推进,对于那些需要递归求解的情形,递归函数必须总能够朝着产生基准情形的方向推进
    
//    int i ;
//    void  recursive(int i);         //第一个递归小测试:使用递归函数将传入的一个数从个位到最高
//    printf("请输入一个整数:");         //位逐个输出
//    scanf("%d",&i);
//    recursive(i);
    
//------练习题
//--练习题1 :编写一个程序解决选择问题.令 y = n/2.显示你的程序对于n为不同值时程序的运行时间
//    int y,n;
//    
//    printf("请输入一个数:");
//    scanf("%d",&n);
//    y  = n/2;
//    printf("%d",y);
    
 //--练习题2 :  编写一个程序求猜字谜游戏
    void this(char ch[4][4]);
    void two(char ch[4][4],char *c,char *d,char *g,int i);
    void fat(char ch[4][4],char *c,char *d,char *g,int i);
    char  ch[4][4] = {{'t','h','i','s'},{'w','a','t','s'},{'o','a','h','g'},{'f','g','d','t'}};
    this(ch);
    char c = '0',d = '0',f = '0';
    int ci = 0;
    two(ch, &c, &d, &f,ci);
    if (c == 'a' && d == 'a' && f == 'a')
        printf("二维数组中有two\n");
    else printf("狗鸡巴\n");
    
    fat(ch, &c, &d, &f,ci);
    if (c == 'a' && d == 'a' && f == 'a')
        printf("二维数组中有two\n");
    else printf("狗鸡巴\n");

    time(&stopTime);
    printf("此程序运行时间为%lf\n",(double)(stopTime-startTime));
}

//第一章

//int arr(int a[],int n)            //证明斐波那契数函数1
//{
//    for (int j = 1; j <= n; ++j) {
//        a[j] = a[j-1] + a[j-2];
//    }
//    printf("函数1的最终输出为%d\n",a[n]);
//    return a[n];
//}

//double feibo(double x)               //证明斐波那契数函数2
//{
//    double l = 5;                    //极坑的一点是千万不要让 double l = (5/3) ,(5/3)的结果灰暗int类型
//    l = l/3;                         //表示
//    
//    for (int j = 0; j < x; j++) {
//        l =  l * l;
//    }
//    printf("函数2的最终输出为%lf\n",l);
//    return l;
//}

//void  recursive(int i)               //使用递归将传入的一个数从个位到最高位逐个输出
//{
//    if (i >= 10)
//        recursive(i/10);
//    printf("%d",i%10);
//    
//}

//--练习题2 :  编写一个程序求猜字谜游戏
void this(char ch[4][4])
{   char c = '0',d = '0',f = '0',g = '0';

        for (int x = 0; x < 4; x++) {
            
            for (int y = 0; y < 4; y++) {
                switch (ch[x][y]) {
                    case 't':c = 'a';
                        break;
                    case 'h':d = 'a';
                        break;
                    case 'i':f = 'a';
                        break;
                    case 's':g = 'a';
                        break;
                    default:
                        break;
                }
            }
        }

    if (c == 'a' && d == 'a' && f == 'a' && g == 'a')
        printf("二维数组中有this");

}
//void two(char ch[4][4],char *c,char *d,char *g,int i)
//{
//    
//    
//            for (int y = 0; y < 4; y++) {
//                switch (ch[i][y]) {
//                    case 't':*c = 'a';
//                        break;
//                    case 'w':*d = 'a';
//                        break;
//                    case 'o':*g = 'a';
//                        break;
//                    default:
//                        break;
//                }
//                if (i < 4) {
//                    i++;
//                    if (*c == 'a' && *d == 'a' && *g == 'a')
//                        break;
//                        
//                    two(ch, c, d, g, i);
//                }
//                
//}
void fat(char ch[4][4],char *c,char *d,char *g,int i)
{
        
        for (int y = 0; y < 4; y++) {
            switch (ch[i][y]) {
                case 'f':*c = 'a';
                    break;
                case 'a':*d = 'a';
                    break;
                case 't':*g = 'a';
                    break;
                default:
                    break;
            }
            if (i < 4) {
                i++;
                if (*c == 'a' && *d == 'a' && *g == 'a')
                    break;
                
                fat(ch, c, d, g, i);
            }
            
        }
}
